#include "classes.h"

#include "inicializacao.h"

using namespace std;

int main()
{
    struct winsize ws;
    int fd=open("/dev/tty",O_RDWR);

    {
        string comeco = "Thiago Romano\nWagner Takeda\n\n	Hypercube Studios \n			presents:\nBus Wars: Legend Of Thérus\n\nHá muito tempo atrás existiam deuses chamados Thérus e Centenarius. Esses deuses conseguiam seus poderes através de seus servos, porém Centenárius foi corrompido pela ambição e entrou em guerra com Thérus para obter o maior número de servos. Você controla o maior legado de Thérus, Pinus Campus Cumpridus, tentando ajudar seu pai.";
        escreveCutscene(comeco);
    }
    int selecao =0;
    while (selecao!=1)
    {
        selecao = menu();
        if (selecao ==2)
            instrucoes();
    }

    srand(time(0));

    vector<ARVORE> arvores;
    vector<VACA> vacas;
    vector<CIDADAO> aldeoes;
    vector <LIMITE> limites;
    vector <BARRACK> barracas;
    vector <GUERREIRO> guerreiro;
    ONIBUS townCenter(10,15);

    MODOCONSTRUCAO modoConstrucao;
    modoConstrucao.ligado = false;
    modoConstrucao.queConstruindo = 'z';

    int TAMX = 80;
    int TAMY = 24;
///************************************************
    LimparTela();
    cout << "GERANDO ARVORES..."<<endl;
    GeraArvore(vacas, arvores, aldeoes, townCenter,barracas, guerreiro);

    cout << "GERANDO VACAS..."<<endl;
    GeraVacas(vacas,arvores,aldeoes, townCenter,barracas, guerreiro);
///************************************************
    int comidaDoJogador = 150, madeiraDoJogador= 200;
    //int frameQueEsta = 0;//pros carinhas esperarem o frame deles....


    int xDoJogador=0, yDoJogador=0;

    float refresh_rate_em_secs = 0.5;
    clock_t final = clock() + (float)CLOCKS_PER_SEC * refresh_rate_em_secs;
    clock_t reverificaTamanho = clock() + (float)CLOCKS_PER_SEC * 0.2;

///******************************************************
    for (int i = LIMITEMINY;; i++)
    {
        for (int j = LIMITEMINX;; j++)
        {
            if (j==LIMITEMINX||j==LIMITEMAXX||i==LIMITEMINY||i==LIMITEMAXY)
            {
                LIMITE a(j,i);
                limites.push_back(a);
            }
            if (j==LIMITEMAXX)
                break;
        }
        if (i==LIMITEMAXY)
            break;
    }
    /*for (int i = 0; i < 100; i++){
        criaObjeto(rand()%200-100,rand()%200-100, nVaca, vacas, arvores, aldeoes);
        //vacas.push_back(a);///Aqui ficara a criacao do mapa...
    }*/

    /*{
        CIDADAO a(9,8);
        aldeoes.push_back(a); ///Estou criando duas arvores para testar... vamos precisar de mais coisas alem de arvores :/ //LEGAL CARA
    }*/
    /*{
        ARVORE a(6,5);
        arvores.push_back(a);
    }
    {
        ARVORE a(5,4);
        arvores.push_back(a);
    }
    {
        ARVORE a(5,6);
        arvores.push_back(a);
    }*/
    /*for(int i = 10; i < 20; i++) //BLAAAAAAAAAAAAAAAAAAAAAAAAAA
    {
        CIDADAO a(i,10);
        aldeoes.push_back(a);
    }*/
    /*{
        ARVORE a(4,5);
        arvores.push_back(a);
    }*/

///**************************************************
    while (true)
    {


        logica(comidaDoJogador, madeiraDoJogador, arvores, vacas, aldeoes, townCenter, barracas, guerreiro);//levando todas as variaveis
        if (clock() > final)
        {
            desenho(TAMX, TAMY, xDoJogador, yDoJogador ,comidaDoJogador, madeiraDoJogador, arvores, vacas, aldeoes, limites, townCenter, modoConstrucao, barracas, guerreiro);//levando todas as variaveis
            final = clock() + float(CLOCKS_PER_SEC) * 0.5;
        }

        if (clock() > reverificaTamanho)
        {
            ioctl(fd,TIOCGWINSZ,&ws);
            TAMX = ws.ws_col;
            TAMY=ws.ws_row;
            reverificaTamanho = clock() + float(CLOCKS_PER_SEC) * 5;
        }

        //usleep(10000);//60framesporsegundo

        if (kbhit())
        {
            char a = Meugetch();
            switch (a)
            {
            case '4':
                if (xDoJogador > LIMITEMINX - TAMX/2 +1)
                    xDoJogador--;
                break;
            case '6':
                if (xDoJogador < LIMITEMAXX - TAMX/2 -1)
                    xDoJogador++;
                break;

            case '8':
                if (yDoJogador > LIMITEMINY - TAMY/2 +2)
                    yDoJogador--;
                break;

            case '2':
                if (yDoJogador < LIMITEMAXY - TAMY/2)
                    yDoJogador++;
                break;

            case '1':
                if (xDoJogador > LIMITEMINX - TAMX/2 +1)
                    xDoJogador--;
                if (yDoJogador < LIMITEMAXY - TAMY/2)
                    yDoJogador++;
                break;
            case '7':
                if (xDoJogador > LIMITEMINX - TAMX/2 +1)
                    xDoJogador--;
                if (yDoJogador > LIMITEMINY - TAMY/2 +2)
                    yDoJogador--;
                break;
            case '9':
                if (xDoJogador < LIMITEMAXX - TAMX/2 -1)
                    xDoJogador++;
                if (yDoJogador > LIMITEMINY - TAMY/2 +2)
                    yDoJogador--;
                break;
            case '3':
                if (xDoJogador < LIMITEMAXX - TAMX/2 -1)
                    xDoJogador++;
                if (yDoJogador < LIMITEMAXY - TAMY/2)
                    yDoJogador++;
                break;

            case'5':
                if (modoConstrucao.ligado)
                {
                    if (modoConstrucao.tentaConstruir(xDoJogador + TAMX/2-3 , yDoJogador + TAMY/2-2 ,vacas, arvores, aldeoes,townCenter ,barracas, guerreiro) != 0)
                        madeiraDoJogador -= 500;
                    modoConstrucao.ligado = false;
                    break;
                }
                for (unsigned int i =0; i < aldeoes.size(); i++)     ///aqui vai ser nescessario colocar novas classes
                {
                    if (aldeoes[i].x == xDoJogador + TAMX/2 && aldeoes[i].y == yDoJogador + TAMY/2-1)
                    {
                        aldeoes[i].selec= (aldeoes[i].selec) ? false : true;
                        townCenter.selec=false;
                        for (unsigned int i =0; i < barracas.size(); i++)
                            barracas[i].selec=false;
                        for (unsigned int i = 0; i < guerreiro.size(); i++)
                            guerreiro[i].selec = false;
                        goto achouQuemEstaSelecionado;
                    }
                }

                for (unsigned int i =0; i < guerreiro.size(); i++)     ///aqui vai ser nescessario colocar novas classes
                {
                    if (guerreiro[i].x == xDoJogador + TAMX/2 && guerreiro[i].y == yDoJogador + TAMY/2-1)
                    {
                        guerreiro[i].selec= (guerreiro[i].selec) ? false : true;
                        townCenter.selec=false;
                        for (unsigned int i =0; i < barracas.size(); i++)
                            barracas[i].selec=false;
                        for (unsigned int i =0; i < aldeoes.size(); i++)
                        aldeoes[i].selec=false;
                        goto achouQuemEstaSelecionado;
                    }
                }

                if ((townCenter.x <= xDoJogador + TAMX/2 && townCenter.x >= xDoJogador + TAMX/2 -6) && (townCenter.y <= yDoJogador + TAMY/2 -1 && townCenter.y >= yDoJogador + TAMY/2-3))
                {
                    townCenter.selec = (townCenter.selec) ? false : true;
                    for (unsigned int i =0; i < aldeoes.size(); i++)
                        aldeoes[i].selec=false;
                    for (unsigned int i =0; i < barracas.size(); i++)
                        barracas[i].selec=false;
                    for (unsigned int i = 0; i < guerreiro.size(); i++)
                            guerreiro[i].selec = false;
                    goto achouQuemEstaSelecionado;
                }

                for (int i =0 ; i < barracas.size(); i++)
                {
                    if ((barracas[i].x <= xDoJogador + TAMX/2 && barracas[i].x >= xDoJogador + TAMX/2 -6) && (barracas[i].y <= yDoJogador + TAMY/2 -1 && barracas[i].y >= yDoJogador + TAMY/2-3))
                    {
                        barracas[i].selec = (barracas[i].selec) ? false : true;
                        for (unsigned int i =0; i < aldeoes.size(); i++)
                            aldeoes[i].selec=false;
                        townCenter.selec=false;
                        for (unsigned int i = 0; i < guerreiro.size(); i++)
                            guerreiro[i].selec = false;
                        goto achouQuemEstaSelecionado;
                    }
                }


                for (unsigned int i =0; i < barracas.size(); i++)
                    barracas[i].selec=false;
                townCenter.selec = false;
                for (unsigned int i =0; i < aldeoes.size(); i++)
                {
                    if (aldeoes[i].selec)
                    {
                        aldeoes[i].defineDest(xDoJogador + TAMX/2, yDoJogador + TAMY/2-1);
                        aldeoes[i].selec=false;
                        aldeoes[i].oQueFazendo = verificaSeHaAlgumaCoisa(aldeoes[i].xDest, aldeoes[i].yDest, vacas, arvores, aldeoes, townCenter, barracas, guerreiro);
                        aldeoes[i].recemEscolhido = true;
                    }
                }
                for (unsigned int i =0; i < guerreiro.size(); i++)
                {
                    if (guerreiro[i].selec)
                    {
                        guerreiro[i].defineDest(xDoJogador + TAMX/2, yDoJogador + TAMY/2-1);
                        guerreiro[i].selec=false;
                        guerreiro[i].oQueFazendo = verificaSeHaAlgumaCoisa(guerreiro[i].xDest, guerreiro[i].yDest, vacas, arvores, aldeoes, townCenter, barracas, guerreiro);
                        guerreiro[i].recemEscolhido = true;
                    }
                }

achouQuemEstaSelecionado:
                break;

            case 'b':
            case 'B':
            {
                if (townCenter.selec)
                {
                    if (comidaDoJogador >= 50)
                    {
                        comidaDoJogador-=50;
                        int  certo = 0;
                        int xTent = -1;
                        int yTent =-1;
                        while (!certo)
                        {
                            certo = criaObjeto(townCenter.x+xTent, townCenter.y+ yTent, nAldeao, vacas,arvores,aldeoes,townCenter, barracas, guerreiro);

                            if (xTent == 8 && yTent == 3)
                            {
                                comidaDoJogador+=50;
                                break;
                            }

                            if (xTent == 8)
                            {
                                xTent = -2;
                                yTent = 3;
                            }
                            xTent++;
                        }
                    }
                }
                for (int i = 0; i < barracas.size();i++)
                {
                    if (barracas[i].selec)
                    {
                        if (comidaDoJogador >= 100)
                        {
                            comidaDoJogador-=100;
                            int  certo = 0;
                            int xTent = -1;
                            int yTent =-1;
                            while (!certo)
                            {
                                certo = criaObjeto(barracas[i].x+xTent, barracas[i].y + yTent, nGuerreiro, vacas,arvores,aldeoes,townCenter, barracas, guerreiro);

                                if (xTent == 8 && yTent == 3)
                                {
                                    comidaDoJogador+=100;
                                    break;
                                }

                                if (xTent == 8)
                                {
                                    xTent = -2;
                                    yTent = 3;
                                }
                                xTent++;
                            }
                        }
                    }
                }
                for (int i = 0; i <aldeoes.size(); i++)
                {
                    if (aldeoes[i].selec)
                    {
                        for (int ia = 0; ia < aldeoes.size(); ia++) //deseleciona todos
                            aldeoes[ia].selec = false;
                        modoConstrucao.ligado = true;
                        break;
                    }
                }
            }
            }
            desenho(TAMX, TAMY, xDoJogador, yDoJogador ,comidaDoJogador, madeiraDoJogador, arvores, vacas,aldeoes, limites, townCenter, modoConstrucao, barracas, guerreiro);//levando todas as variaveis
        }
    }
}
